﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos
Public Class ProveedoresBL

    Public Function RegistrarProveedor(ByVal TokenConexion As String, ByVal Proveedor As ProveedoresBE, ByRef detResp As DetalleRespuesta) As Boolean
        Dim ProvDAL As ProveedoresDAL = New ProveedoresDAL("")
        detResp.Mensajes = ""
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoParaRegistrar(Proveedor, detResp.Mensajes)) Then
                ProvDAL = New ProveedoresDAL(TokenConexion)
                If (ProvDAL.existeProveedor(Proveedor.CvePro)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_PreviamenteRegistrado,
                                             "Existe un registro con la mismo clave del proveedor indicado." & vbCrLf & detResp.Mensajes)
                    Return False
                Else
                    If (ProvDAL.registraProveedor(Proveedor)) Then
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "El Proveedor se registro con éxito.")
                        Return True
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                 "El Proveedor no pudo ser registrado en el sistema." & vbCrLf & detResp.Mensajes)
                        Return False
                    End If
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El Proveedor no es valido para registrar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "ProveedoresBL.RegistrarProveedor")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al registrar el Proveedor: " & ex.Message)
            Return False
        Finally
            ProvDAL = Nothing
        End Try
    End Function

    Private Function EsValidoParaRegistrar(ByRef Proveedor As ProveedoresBE, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(Proveedor.CvePro)) Then
                mensaje &= "La Clave del Proveedor es obligatoria." & vbCrLf
            Else
                Proveedor.CvePro = Proveedor.CvePro.Trim
                If (Proveedor.CvePro.Length > 20) Then
                    Proveedor.CvePro = Proveedor.CvePro.Substring(0, 20)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Proveedor.RfcPro)) Then
                mensaje &= "El RFC del Proveedor es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                Proveedor.RfcPro = Proveedor.RfcPro.Trim.ToUpper

                Select Case Proveedor.RfcPro.Length
                    Case 12
                        If (Not (csValidaciones.esRFCValidoPersonaMoral(Proveedor.RfcPro))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Moral", Proveedor.RfcPro) & vbCrLf
                        End If

                    Case 13
                        If (Not (csValidaciones.esRFCValidoPersonaFisica(Proveedor.RfcPro))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Física", Proveedor.RfcPro) & vbCrLf
                        End If

                    Case Else
                        mensaje &= String.Format("Longitud de RFC no válida (<{0}>)", Proveedor.RfcPro) & vbCrLf
                End Select
            End If

            If (String.IsNullOrWhiteSpace(Proveedor.RazonSocial)) Then
                mensaje &= "La Razon Social del Proveedor es obligatoria." & vbCrLf
            Else
                Proveedor.RazonSocial = Proveedor.RazonSocial.Trim
                If (Proveedor.RazonSocial.Length > 255) Then
                    Proveedor.RazonSocial = Proveedor.RazonSocial.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Calle)) Then
                Proveedor.Calle = Proveedor.Calle.Trim
                If (Proveedor.Calle.Length > 150) Then
                    Proveedor.Calle = Proveedor.Calle.Trim.Substring(0, 150)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.NoExterior)) Then
                Proveedor.NoExterior = Proveedor.NoExterior.Trim
                If (Proveedor.NoExterior.Length > 50) Then
                    Proveedor.NoExterior = Proveedor.NoExterior.Trim.Substring(0, 50)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.NoInterior)) Then
                Proveedor.NoInterior = Proveedor.NoInterior.Trim
                If (Proveedor.NoInterior.Length > 50) Then
                    Proveedor.NoInterior = Proveedor.NoInterior.Trim.Substring(0, 50)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Colonia)) Then
                Proveedor.Colonia = Proveedor.Colonia.Trim
                If (Proveedor.Colonia.Length > 50) Then
                    Proveedor.Colonia = Proveedor.Colonia.Trim.Substring(0, 50)
                End If
            End If

            If (Not String.IsNullOrWhiteSpace(Proveedor.Localidad)) Then
                Proveedor.Localidad = Proveedor.Localidad.Trim
                If (Proveedor.Localidad.Length > 50) Then
                    Proveedor.Localidad = Proveedor.Localidad.Trim.Substring(0, 50)
                End If
            End If

            If (Not String.IsNullOrWhiteSpace(Proveedor.Referencia)) Then
                Proveedor.Referencia = Proveedor.Referencia.Trim
                If (Proveedor.Referencia.Length > 50) Then
                    Proveedor.Referencia = Proveedor.Referencia.Trim.Substring(0, 50)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Municipio)) Then
                Proveedor.Municipio = Proveedor.Municipio.Trim
                If (Proveedor.Municipio.Length > 50) Then
                    Proveedor.Municipio = Proveedor.Municipio.Trim.Substring(0, 50)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Estado)) Then
                Proveedor.Estado = Proveedor.Estado.Trim
                If (Proveedor.Estado.Length > 50) Then
                    Proveedor.Estado = Proveedor.Estado.Trim.Substring(0, 50)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Pais)) Then
                Proveedor.Pais = Proveedor.Pais.Trim
                If (Proveedor.Pais.Length > 50) Then
                    Proveedor.Pais = Proveedor.Pais.Trim.Substring(0, 50)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.CodigoPostal)) Then
                Proveedor.CodigoPostal = Proveedor.CodigoPostal.Trim
                If (Not csValidaciones.esCodigoPostalValido(Proveedor.CodigoPostal)) Then
                    mensaje &= String.Format("Código Postal <{0}> debe ser de 5 dígitos", Proveedor.CodigoPostal) & vbCrLf
                End If
            End If

            'NO SE VALIDAN OPCIONALES Y REQUERIDOS DE ACUERDO A ANEXO 20 YA QUE SI SE HICIERA, 
            'SERÍA SOBRE PROVEEDORES NACIONALES COMO EMISOR, PERO TAMBIEN HAY PROVEEDORES EXTRANJEROS 
            'POR LO QUE NO SE VALIDARÁ NINGUN DATO DE DOMICILIO, TODOS SON OPCIONALES

            If Not (String.IsNullOrWhiteSpace(Proveedor.Telefono1)) Then
                Proveedor.Telefono1 = Proveedor.Telefono1.Trim
                If (Proveedor.Telefono1.Length > 20) Then
                    Proveedor.Telefono1 = Proveedor.Telefono1.Substring(0, 20)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Telefono2)) Then
                Proveedor.Telefono2 = Proveedor.Telefono2.Trim
                If (Proveedor.Telefono2.Length > 20) Then
                    Proveedor.Telefono2 = Proveedor.Telefono2.Substring(0, 20)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Fax)) Then
                Proveedor.Fax = Proveedor.Fax.Trim
                If (Proveedor.Fax.Length > 20) Then
                    Proveedor.Fax = Proveedor.Fax.Substring(0, 20)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.CorreoElect)) Then
                Proveedor.CorreoElect = Proveedor.CorreoElect.Trim
                If (Proveedor.CorreoElect.Length > 255) Then
                    Proveedor.CorreoElect = Proveedor.CorreoElect.Substring(0, 255)
                End If
                If (Not (csValidaciones.esCorreoValido(Proveedor.CorreoElect))) Then
                    mensaje &= String.Format("Dirección de Correo Electrónico <{0}> no válido", Proveedor.CorreoElect) & vbCrLf
                End If
            Else
                Proveedor.CorreoElect = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.DirInternet)) Then
                Proveedor.DirInternet = Proveedor.DirInternet.Trim
                If (Proveedor.DirInternet.Length > 255) Then
                    Proveedor.DirInternet = Proveedor.DirInternet.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Contacto)) Then
                Proveedor.Contacto = Proveedor.Contacto.Trim
                If (Proveedor.Contacto.Length > 255) Then
                    Proveedor.Contacto = Proveedor.Contacto.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Zona)) Then
                Proveedor.Zona = Proveedor.Zona.Trim
                If (Proveedor.Zona.Length > 50) Then
                    Proveedor.Zona = Proveedor.Zona.Trim.Substring(0, 50)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Proveedor.Grupo)) Then
                Proveedor.Grupo = Proveedor.Grupo.Trim
                If (Proveedor.Grupo.Length > 50) Then
                    Proveedor.Grupo = Proveedor.Grupo.Trim.Substring(0, 50)
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "ProveedoresBL.EsValidoParaRegistrar")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function ActualizaProveedor(ByVal TokenConexion As String, ByVal Proveedor As ProveedoresBE, ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim ProvDAL As ProveedoresDAL = New ProveedoresDAL("")
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoParaRegistrar(Proveedor, detResp.Mensajes)) Then
                ProvDAL = New ProveedoresDAL(TokenConexion)
                If (ProvDAL.actualizaProveedor(Proveedor)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Datos del Proveedor actualizados.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de Datos del Proveedor." & vbCrLf &
                                             "Verifique que la Clave del Proveedor esté registrada en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "ProveedoresBL.ActualizaProveedor")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al actualizar Proveedor: " & ex.Message)
            Return False
        Finally
            ProvDAL = Nothing
        End Try
    End Function

    Public Function GetProveedor(ByVal tokenConexion As String, ByVal CvePro As String, ByRef detResp As DetalleRespuesta) As ProveedoresBE
        detResp.Mensajes = ""
        Dim ProvDAL As ProveedoresDAL = New ProveedoresDAL("")
        Dim ProvBE As ProveedoresBE
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetProveedor(CvePro, detResp.Mensajes)) Then
                ProvDAL = New ProveedoresDAL(tokenConexion)
                ProvBE = ProvDAL.getProveedor(CvePro)
                If (ProvBE IsNot Nothing) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo la información del Proveedor con éxito.")
                    Return ProvBE
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             "No se obtuvo la información del Proveedor" & vbCrLf & detResp.Mensajes)
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La Clave del Proveedor proporcionado no es válida: " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "ProveedoresBL.GetProveedor")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al obtener información del Proveedor: " & ex.Message)
            Return Nothing
        Finally
            ProvDAL = Nothing
            ProvBE = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetProveedor(ByRef CvePro As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(CvePro)) Then
                mensaje &= "La Clave del Proveedor es obligatoria" & vbCrLf
            Else
                CvePro = CvePro.Trim
                If (CvePro.Length > 20) Then
                    CvePro = CvePro.Substring(0, 20)
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "ProveedoresBL.EsValidoParaGetProveedor")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetListadoProveedor(ByVal tokenConexion As String, ByVal RfcPro As String, ByVal CorreoElect As String, ByVal RazonSocial As String,
                                        ByVal estatus As Enumeraciones.estatusParaBusquedas,
                                        ByVal pRegistroInicial As Integer, ByVal pPageSize As Integer,
                                        ByVal pSortColumn As Enumeraciones.campoOrdenamiento, ByVal pSortDirection As Enumeraciones.tipoOrdenamiento,
                                        ByRef pTotalRegistros As Integer,
                                        ByRef detResp As DetalleRespuesta) As List(Of ProveedoresBE)
        detResp.Mensajes = ""
        pTotalRegistros = 0
        Dim ProvDAL As ProveedoresDAL = New ProveedoresDAL("")
        Dim LProvBE As List(Of ProveedoresBE)
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            ProvDAL = New ProveedoresDAL(tokenConexion)
            LProvBE = ProvDAL.getListadoProveedores(RfcPro, CorreoElect, RazonSocial, estatus, pRegistroInicial, pPageSize, pSortColumn, pSortDirection, pTotalRegistros)
            If (LProvBE IsNot Nothing) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo el listado de los Proveedores con éxito.")
                Return LProvBE
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoObtuvoRegistrosParaListado,
                                         "No se obtuvo el listado de Proveedores" & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "ProveedoresBL.GetListadoProveedor")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al obtener el listado de Proveedores: " & ex.Message)
            Return Nothing
        Finally
            ProvDAL = Nothing
            LProvBE = Nothing
        End Try
    End Function

    Function CambiaEstatus(ByVal tokenConexion As String, ByVal CvePro As String, ByVal setActivo As Boolean, ByVal detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim ProvDAL As ProveedoresDAL = New ProveedoresDAL("")
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetProveedor(CvePro, detResp.Mensajes)) Then
                ProvDAL = New ProveedoresDAL(tokenConexion)
                If (ProvDAL.cambiaStatus(CvePro, setActivo)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Estatus del Proveedor actualizados.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de estatus del Proveedor." & vbCrLf &
                                             "Verifique que la Clave del Proveedor esté registrada en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "ProveedoresBL.CambiaEstatus")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                        detResp.Mensajes & "Excepción al actualizar estatus del Proveedor: " & ex.Message)
            Return False
        Finally
            ProvDAL = Nothing
        End Try
    End Function

End Class
